SYNASER

Otázka od: Petr Vetesnik

24. 5. 2004 13:22

Vazeni programatori,
prosim o informace o praci s balickem SYNASER pro komunikaci pres COM port.
Duvod: chtel bych komunikovat se zarizenim pres COM1. Znam rychlost, paritu,
format dat, format zpravy vysilane do zarizeni, format zpravy ze zarizeni.
Nejak se mi ale nedari komunikovat. Zarizeni moji zpravu zpracuje, dokonce
se nastavi dle parametru, ale tim to konci. Ne tydnu laborovani se mi
nepodarilo odchytit zpravu, kterou posila zarizeni. Pokud pripojim 'spiona'
na linku, zprava prijde. Vypada to, jako by se pocitac nedokazal vcas
prepnout na prijem a pri pouziti 'spiona' to stihal.
Veskerou pomoc uvitam.

wetty



Odpovedá: Lukas Gebauer

24. 5. 2004 14:22

> prosim o informace o praci s balickem SYNASER pro komunikaci pres COM
> port. Duvod: chtel bych komunikovat se zarizenim pres COM1. Znam
> rychlost, paritu, format dat, format zpravy vysilane do zarizeni,
> format zpravy ze zarizeni. Nejak se mi ale nedari komunikovat.
> Zarizeni moji zpravu zpracuje, dokonce se nastavi dle parametru, ale
> tim to konci. Ne tydnu laborovani se mi nepodarilo odchytit zpravu,
> kterou posila zarizeni. Pokud pripojim 'spiona' na linku, zprava
> prijde. Vypada to, jako by se pocitac nedokazal vcas prepnout na
> prijem a pri pouziti 'spiona' to stihal. Veskerou pomoc uvitam.

Jakym zpusobem tu zpravu ctes?


--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Petr Vetesnik

25. 5. 2004 4:49


>
> Jakym zpusobem tu zpravu ctes?
>
> --
> Lukas Gebauer.
>

Pomoci WaitingData a nasledne RecvBuffer (RecvBufferEx), viz nize.

synaser->SendBuffer(SendBuffer,Length);
if (synaser->CanReadEx(1000)) {
  int vel = synaser->WaitingData();
  if (vel>0) {
    char* buffer = new char[vel];
    vel = synaser->RecvBuffer(buffer,vel);
    delete [] buffer;
  }
}

Wetty


Odpovedá: Lukas Gebauer

25. 5. 2004 9:36

> Pomoci WaitingData a nasledne RecvBuffer (RecvBufferEx), viz nize.
>
> synaser->SendBuffer(SendBuffer,Length);
> if (synaser->CanReadEx(1000)) {
> int vel = synaser->WaitingData();
> if (vel>0) {
> char* buffer = new char[vel];
> vel = synaser->RecvBuffer(buffer,vel);
> delete [] buffer;
> }
> }

No, tak to je krasne spatne.  

Bud pouzivej nizkourovnove cteni pres canread (ne canreadex) a
RecvBuffer, nebo na to jdi vysokourovnove pres RecvBufferEx BEZ
jakehokoliv canread. (nebo jakkakoliv jina cteci funkce, ktera ma
jako parametr timeout)

Napriklad tvuj kus kodu ma patrne precist vsechno, co ceka na
precteni... Pak lze cely tvuj cteci kod nahradit jednimjedinym
volanim funkce RecvPacket.



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Petr Vetesnik

25. 5. 2004 10:37

>
> Bud pouzivej nizkourovnove cteni pres canread (ne canreadex) a
> RecvBuffer, nebo na to jdi vysokourovnove pres RecvBufferEx BEZ
> jakehokoliv canread. (nebo jakkakoliv jina cteci funkce, ktera ma
> jako parametr timeout)
>
> Napriklad tvuj kus kodu ma patrne precist vsechno, co ceka na
> precteni... Pak lze cely tvuj cteci kod nahradit jednimjedinym
> volanim funkce RecvPacket.

Pri pouziti RecvPacket se komunikace chova stejne.
Vypada to, jako by pri vysilani dat nebylo umozneno zaroven cteni (full
duplex) a pocitac se nestacil prepnout.
Pokud jsem komunikoval se zarizenim, ktere ma prodlevu (i minimalni) mezi
zpravou prijimanou a vysilanou, nebyl problem.
Bohuzel aktualni zarizeni tuto vlastnost nema.
Na port se pripojuji
  synaser->Connect("COM2");
  synaser->Config(9600,8,'N',0,false,false);
  synaser->EnableRTSToggle(false);


Odpovedá: Lukas Gebauer

25. 5. 2004 11:07

> Pri pouziti RecvPacket se komunikace chova stejne.
> Vypada to, jako by pri vysilani dat nebylo umozneno zaroven cteni
> (full duplex) a pocitac se nestacil prepnout. Pokud jsem komunikoval
> se zarizenim, ktere ma prodlevu (i minimalni) mezi zpravou prijimanou
> a vysilanou, nebyl problem. Bohuzel aktualni zarizeni tuto vlastnost
> nema. Na port se pripojuji
> synaser->Connect("COM2");
> synaser->Config(9600,8,'N',0,false,false);
> synaser->EnableRTSToggle(false);

No, normalni RS232 je fullduplex! Halfduplex je treba RS485, ktere se
obcas pripojuje k seriaku pres prevodnik, a ten je nekdy potreba
prepinat.

Pokud takove zarizeni mas, pak pouzij EnableRTSToggle(true)... (false
je defaultni stav!) Pochopitelne jen pokud se tvuj prevodnik prepina
pomoci RTS signalu. nektere prevodniky se prepinaji jinak, nektere
treba automaticky, atd.



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Petr Vetesnik

25. 5. 2004 11:24

> Pokud takove zarizeni mas, pak pouzij EnableRTSToggle(true)... (false
> je defaultni stav!) Pochopitelne jen pokud se tvuj prevodnik prepina
> pomoci RTS signalu. nektere prevodniky se prepinaji jinak, nektere
> treba automaticky, atd.
>

Prave ze nema, jedna se pripojeni pres RS232, komunikacni kabel mam
klasickou prodluzku.

wetty


Odpovedá: Lukas Gebauer

25. 5. 2004 14:19

> Prave ze nema, jedna se pripojeni pres RS232, komunikacni kabel mam
> klasickou prodluzku.

Tak to fakt nevim, kde je zakopany pes. (s timto jsem se fakt jeste
nesetkal...) Kdyz to krokujes, tak ti to chodi?


--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Petr Fejfar

25. 5. 2004 17:15

Petr Vetesnik wrote:

> tim to konci. Ne tydnu laborovani se mi nepodarilo odchytit zpravu,
> kterou posila zarizeni.

Sice neznam Synaser, ale nejdriv bys mel zjistit, jestli data vubec nelezou
nebo
jestli utikaji (overrun error).


> Pokud pripojim 'spiona' na linku, zprava
> prijde. Vypada to, jako by se pocitac nedokazal vcas prepnout na
> prijem a pri pouziti 'spiona' to stihal.

Pokud zadna data netecou, tak to spis vypada na nezapojeny vstup CTS
- ten na HW urovni blokuje prijimac UARTu - je mozne, ze po pripojeni
spiona je napajen z nej popr. se zmeni impedance a hazardni stav se
neprojevuje.


HTH, pf